import java.util.ArrayList;

/**
 *
 * @author Owner
 */
public final class Grafo implements GrafoInterface<Integer>{

	private int numero;
        private int numero2;

	private int matriz[][][];
        
        private int max[];

	private String nombres[];

	Grafo(int num) {
		this.numero = num;
		this.matriz = new int[numero][numero][2];
		this.nombres = new String[numero];
                this.max = new int [numero];
	}

	public void agregarArco(int nodo1, int nodo2, int peso) {
		this.matriz[nodo1][nodo2][0] = peso;
		this.matriz[nodo2][nodo1][0] = peso;
		this.matriz[nodo1][nodo2][1] = nodo1;
		this.matriz[nodo2][nodo1][1] = nodo2;
	}

	public void ingresarNombre(int nodo, String palabra) {
		this.nombres[nodo] = palabra;
	}

	public void calcular() {
            
            //Este es el algoritmo de Floyd
            
		int i, j, k;
		for (i = 0; i < this.numero; i++) {
			for (j = 0; j < this.numero; j++) {
				for (k = 0; k < this.numero; k++) {
					if (this.matriz[i][k][0] + this.matriz[k][j][0] < this.matriz[i][j][0]) {
						this.matriz[i][j][0] = this.matriz[i][k][0]
								+ this.matriz[k][j][0];
						this.matriz[i][j][1] = k;
					}
				}
			}
		}
	}
        
        public String centro() {
            
            //Este es el algoritmo que permite calcular el centro del grafo
            
            int nod1, nod2;
            int max = 0;
            int min = 1000;
            int nodocentral = 0;
            
            calcular();
            
            for (nod1 = 0; nod1 < this.numero; nod1++){
                for (nod2 = 0; nod2 < this.numero; nod2++){
                    if(this.matriz [nod1][nod2][0]> max){
                        max = this.matriz [nod1][nod2][0];
                    }
                    
                }
                
                this.max [nod1] = max;
                    
            }
            
            for (nod1 = 0; nod1 < this.numero; nod1++){
                if(this.max [nod1]<min){
                    min = this.max[nod1];
                    nodocentral = nod1;
                }
            }
            
            
            return getNombre(nodocentral);
            
        }
        
	public int pesominimo(int org, int des) {
		return this.matriz[org][des][0];
	}

	public String caminocorto(int org, int des) {
		String cam;
		if (org == des) {
			cam = "->" + nombres[org];
		} else {
			cam = caminocorto(org, this.matriz[org][des][1]) + "->"
					+ nombres[des];
		}
		return cam;
	}

	public String getNombre(int nodo) {
		return this.nombres[nodo];
	}
        
        public int getNodo(String depar){
            int x;
            int nod = 1000;
            
            for (x = 0; x < this.numero; x++){
                if (getNombre(x).equals(depar) ){
                    nod = x;
                                    
                }
            }
                
            return nod;
        }
        
        

   
        public void agregarNodo() {
            
        }

    
        public void agregarArco(Integer nodo1, Integer nodo2, Integer peso) {
        
        }
        
        
        
        
        private class N{
            
        private ArrayList lista = new ArrayList();
        private ArrayList lista2;
        private ArrayList lista3;
        public N(int a){
            for(int i=0; i<a; i++){
                lista.add(new ArrayList());
                lista2 = (ArrayList) lista.get(i);
                for (int b=0; b<a; b++){
                    lista2.add(new ArrayList());
                    lista3= (ArrayList) lista2.get(b);
                    lista3.add(new ArrayList());
                }
            }
        }
            
    
    
    
}
}
